require 'rubygems'
require 'hpricot'
require 'net/http'
require 'net/https'
require 'datos_consumo'
require 'json'
require 'pp'

class APIdatosFactura
  def get_data(login, pass)
  
    if(login.index(/[0-9]/,1)==1) 
      #Particular
      tipo=1
    else
      #Empresa
      tipo=2
    end
    datos=DatosConsumo.new
    # urlS 
    url = "www.canalcliente.movistar.es"
    url_login="/fwk/cda/controller/CCLI_CW_publico/CWEB_Login_Controlador_DIV/0,5635,,00.html"
    url_verification= "/fwk/cda/controller/CCLI_CW_privado/0,2217,259_0_2326_0_0,00.html"
    url_consumo = "/fwk/cda/controller/CCLI_CW_privado/0,2217,259_34641437_35132753_1_,00.html"
    url_consumo1= "/fwk/cda/controller/CCLI_CW_privado/0,2217,259_1563_18171__,00.html"
    url_detalle = "/fwk/cda/controller/CCLI_CW_privado/0,2217,259_34641437_35132753_0_,00.html"
    url_detalle1 = "/fwk/cda/controller/CCLI_CW_privado/0,2217,259_34641405_18171_0_,00.html"
    url2="sslwb.movistar.es"
    url_login2="/auth/Login"
  
    ## iniciamos conexiÃ³n
    
    http = Net::HTTP.new(url, 443)
    http.use_ssl = true
    
    ## nos logueamos

    data = "OK=%2B%2B%2B%2BOK%2B%2B%2B%2B&LOCALE=en_US&AUTHMETHOD=UserPassword&pageGenTime=9999999999999&usr_password=KjhG3Tv51&pgeac=#{pass}&usr_name=#{login}&HiddenURI=https%3A%2F%2Fwww.canalcliente.movistar.es%2Ffwk%2Fcda%2Fcontroller%2FCCLI_CW_privado%2F0%2C2217%2C259_0_2326_0_0%2C00.html"
    if (tipo==1)
      data=data+"&TipoUsuario=titular&Segmento=Particulares"
    end
    headers = {
      'User-Agent'    => 'Mozilla/4.0',
      'Content-Type'  => 'application/x-www-form-urlencoded',
      'Connection'    => 'Keep-Alive'
    }
    resp, data = http.post(url_login, data, headers)
 
    #Cogemos la cookie
 
    cookie = resp.response['set-cookie']
    #Extraemos vgnvisitor
    vgn=getStringCookie(cookie,"vgnvisitor")
  
    #Extraemos JSESSIONID
    jsessionid=getStringCookie(cookie,"JSESSIONID")
    
  
    headers2 = {
      'Cookie'        => jsessionid,
      'User-Agent'    => 'Mozilla/4.0',
      'Content-Type'  => 'application/x-www-form-urlencoded',
      'Connection'    => 'Keep-Alive'
    }
    
    #Segunda petición
    http2 = Net::HTTP.new(url2, 443)
    http2.use_ssl = true
    data2="OK=%2B%2B%2B%2BOK%2B%2B%2B%2B&LOCALE=en_US&AUTHMETHOD=UserPassword&pageGenTime=9999999999999&usr_password=KjhG3Tv51&pgeac=#{pass}&usr_name=#{login}&HiddenURI=https%3A%2F%2Fwww.canalcliente.movistar.es%2Ffwk%2Fcda%2Fcontroller%2FCCLI_CW_privado%2F0%2C2217%2C259_0_2326_0_0%2C00.html"
    resp2, data2 = http2.post(url_login2, data2, headers2)
    
    #Cogemos la segunda cookie
    cookie = resp2.response['set-cookie']
  
    #Extraemos el AUTHSESSION_ID
    auth=getStringCookie(cookie,"AUTH_SESSION_ID")
  
    #Creamos la cookie final
    cookie=vgn+";"+jsessionid+";"+auth
     
    #Validación
    
    headers = {
      'Cookie'        => cookie,
      'User-Agent'    => 'Mozilla/4.0',
      'Content-Type'  => 'application/x-www-form-urlencoded',
      'Connection'    => 'Keep-Alive'
    }
    
     resp, data = http.get(url_verification, headers)
    #Obtener consumo
    if(tipo==1)
      
      resp, data = http.get(url_consumo1, headers)
    else
      dataConsumo="opcion=1&servicio=movistar&tipoConsulta=telefono&cifnif=#{login}&tipoDesglose=llamada&tipoResultado=0&desde=&hasta=&pulsado=&centro=&numRegUltimo=0&numRegMostrados=0&bCentros=false&seleccion_busqueda=Consulta+por+M%C3%B3vil"
      resp, data = http.post(url_consumo, dataConsumo, headers)
    end
    doc = Hpricot(resp.response.body)

    #Obtenemos el teléfono 
    telefono = doc.search("//b")
    if telefono.empty?
      return nil # Error de Canal cliente (web no accesible)
    end
    telefono=telefono[telefono.length-1]
    if telefono.empty?
      return nil # Error de Canal cliente (web no accesible)
    end
    telefono = telefono.inner_html
    telefono=telefono.delete("\n \t")
    datos.number=telefono
    #Obtenemos el detalle de llamadas
    if(tipo==1)
      dataDetalle="opcion=3&telefono=#{telefono}&numRegUltimo=5&numRegMostrados=25&bMostrarFlechaAnterior=&bMostrarFlechaSiguiente=&tipoConsulta=&centro=&tlfcorporativo=&desde=&hasta=&cifnif=&pulsado=nada&tipoDesglose=llamada&mostrarGrafico=&TipoBusqueda=Cronologico&TipoOrden=asc&tipoResultado=0&servicio=movistar&Reiniciar=&tipoConsumo=actual"
      resp, data = http.post(url_detalle1, dataDetalle, headers)
    else
      dataDetalle="opcion=5&telefono=#{telefono}&numRegUltimo=8&numRegMostrados=8&bMostrarFlechaAnterior=&bMostrarFlechaSiguiente=&tipoConsulta=telefono&centro=&tlfcorporativo=&desde=&hasta=&cifnif=#{login}&pulsado=nada&tipoDesglose=llamada&mostrarGrafico=&TipoBusqueda=Cronologico&TipoOrden=asc&tipoResultado=0&servicio=movistar&Reiniciar=&tipoConsumo=actual"
      resp, data = http.post(url_detalle, dataDetalle, headers)
    end
    
    doc = Hpricot(resp.response.body)
  
    llamadas = doc.search("//tr[@class='texto']")
    
    datos.setConsumo(llamadas)
    
    return datos.to_json
  end

  def getStringCookie(cookie,id)
    aux=cookie.index(";",cookie.index(id))-cookie.index(id)
    ret=cookie[cookie.index(id),aux]
    return ret
  end
end

if __FILE__ == $0
  USER = 'USER_CANALCLIENTE'
  PASSWORD = 'PASSWORD_CANALCLIENTE'
  api=APIdatosFactura.new
  result = api.get_data(USER, PASSWORD)
  pp JSON.parse(result)
end

